package com.mmy.service.impl.bidtender;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.mmy.controller.UtilConstants;
import com.mmy.dao.bidtender.TBidInviteRepository;
import com.mmy.dao.bidtender.TBidTenderRepository;
import com.mmy.dao.bidtender.VBidInviteRepository;
import com.mmy.dao.constzone.TConstZoneRepository;
import com.mmy.dao.sys.TSysOrgRepository;
import com.mmy.domain.bidtender.TBidInvite;
import com.mmy.domain.bidtender.TBidTender;
import com.mmy.domain.bidtender.VBidInvite;
import com.mmy.domain.constzone.TConstZone;
import com.mmy.domain.sys.TSysOrg;
import com.mmy.domain.sys.TSysUser;
import com.mmy.service.ServiceCommon;
import com.mmy.service.bidtender.BidInviteService;

@Service
public class BidInviteServiceImpl implements BidInviteService {
	@Autowired
	TBidInviteRepository tBidInviteRepository;
	@Autowired
	VBidInviteRepository vBidInviteRepository;
	@Autowired
	ServiceCommon common;
	@Autowired
	TSysOrgRepository tSysOrgRepository;
	@Autowired
	TConstZoneRepository tConstZoneRepository;
	@Autowired
	TBidTenderRepository tBidTenderRepository;

	/**
	 * 个人中心通过登录人获取招标信息 获取分页
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public HashMap<String, Integer> mapInvite(String pageNumber, String pageSize, TSysUser sessionSysUser) {
		String strUserName = sessionSysUser.getUserName();
		int iOrgID = sessionSysUser.getOrgID();

		HashMap<String, Integer> mapPage = new HashMap<String, Integer>();
		mapPage = common.getPage(pageNumber, pageSize, tBidInviteRepository.countByCreator(strUserName, iOrgID));
		return mapPage;
	}

	/**
	 * 个人中心通过创建人查找招标信息
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public List<VBidInvite> findByCreator(String pageNumber, String pageSize, TSysUser sessionSysUser) {
		int iPageSize = 0;
		int iTempPageNo = 0;
		if (pageNumber == null) {
			pageNumber = "1";
		}
		if (pageSize == null) {
			iPageSize = 20;
		} else {
			iPageSize = Integer.valueOf(pageSize);
			iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		}
		String strUserName = sessionSysUser.getUserName();
		int iOrgID = sessionSysUser.getOrgID();
		List<VBidInvite> lstBidInvite = vBidInviteRepository.findByCreator(strUserName, iOrgID, iTempPageNo, iPageSize);
		return lstBidInvite;
	}

	/**
	 * 个人中心 点击招标名称 显示详情 通过招标ID查找招标信息 删除招标时查询
	 * 
	 * 后台查看该招标写详细信息
	 * 
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public VBidInvite findByInviteID(String strInviteID) {
		int iInviteID = Integer.parseInt(strInviteID);
		return vBidInviteRepository.findByInviteID(iInviteID);
	}

	/**
	 * 个人中心撤标 通过招标ID删除招标信息
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public void deleteByInviteID(String strInviteID) {
		int iInviteID = Integer.parseInt(strInviteID);
		tBidInviteRepository.deleteByInviteID(iInviteID);
	}

	/**
	 * 后台招标管理中显示自己公司的招标信息如果为管理员显示全部
	 *
	 * @author 创建人 hanxl
	 * @date 创建日期 2021.02.22
	 */
	public List<VBidInvite> findBidInvite(TSysUser sessionSysUser) {
		int iOrgID = sessionSysUser.getOrgID();
		List<VBidInvite> lstBidInvite = new ArrayList<VBidInvite>();
		if (sessionSysUser.getUserID() == 0) {
			lstBidInvite = vBidInviteRepository.findALL();
		} else {
			lstBidInvite = vBidInviteRepository.findByOrgID(iOrgID);
		}
		return lstBidInvite;
	}

	/**
	 * 后台招标管理中显示自己公司的招标信息如果为管理员显示全部 异步加载表格
	 *
	 * @author 创建人 hanxl 整理 修改人hanxl
	 * @date 创建日期 2020.11.19 修改时间2021.02.22
	 */

	public List<VBidInvite> findByOrgID(TSysUser sessionSysUser, String strInviteName, String strType, int index,
			int count) {

		if (strInviteName == null)
			strInviteName = "";
		if (strType == null)
			strType = "";
		int iOrgID = sessionSysUser.getOrgID();
		List<VBidInvite> lstBidInvite = new ArrayList<VBidInvite>();
		if (sessionSysUser.getUserID() == 0) {
			lstBidInvite = vBidInviteRepository.findSearchALL(strInviteName, strType, index, count);
		} else {
			lstBidInvite = vBidInviteRepository.findSearchByOrgID(iOrgID, strInviteName, strType, index, count);
		}
		return lstBidInvite;

	}

	/**
	 * 后台招标管理中显示自己公司的招标信息如果为管理员显示全部 分页
	 *
	 * @author 创建人 hanxl 整理 修改人hanxl
	 * @date 创建日期 2020.11.19 修改时间2021.02.22
	 */

	public int queryBaseCount(TSysUser sessionSysUser, String strInviteName, String strType) {

		if (strInviteName == null)
			strInviteName = "";
		if (strType == null)
			strType = "";
		int iOrgID = sessionSysUser.getOrgID();
		int count = 0;
		if (sessionSysUser.getUserID() == 0) {
			count = tBidInviteRepository.countALL(strInviteName, strType);
		} else {
			count = tBidInviteRepository.countByOrgID(iOrgID, strInviteName, strType);
		}
		return count;
	}

	/**
	 * 获得最大编号
	 * 
	 * @return 返回值说明 最大ID
	 * @author 创建人 hanxl
	 * @date 创建日期 2020.11.19
	 */
	public int getMaxInviteID() {
		// 流水号
		Object objCode = tBidInviteRepository.getMaxInviteID();
		int iID = 0;
		if (objCode != null) {
			iID = Integer.parseInt(objCode.toString());
		}
		return iID;
	}

	/**
	 * 函数功能说明：后台 新建招标信息
	 *
	 * @param 参数说明 tBidInvite
	 * @return 返回值说明 jsp页面
	 * @author 创建人 hanxl
	 * @date 创建日期 2020.11.19
	 */
	public void createInvite(TBidInvite tBidInvite, String strOutDateTime, String strBackDateTime,
			String strBeginDateTime, String strEndDateTime, TSysUser sessionSysUser) {
		// 获得最大招标编号
		int iInviteID = common.createBaseCode(UtilConstants.TableName.T_BID_INVITE);
		tBidInvite.setInviteID(iInviteID);

		Calendar calOutDate = Calendar.getInstance();
		calOutDate.setTime(common.formatDate(strOutDateTime, UtilConstants.DateStyle.YYYY_MM_DD));
		calOutDate.set(Calendar.HOUR_OF_DAY, 0);
		calOutDate.set(Calendar.MINUTE, 0);
		calOutDate.set(Calendar.SECOND, 0);
		calOutDate.set(Calendar.MILLISECOND, 1);
		tBidInvite.setOutDate(calOutDate.getTime());
		Calendar calBackDate = Calendar.getInstance();
		calBackDate.setTime(common.formatDate(strBackDateTime, UtilConstants.DateStyle.YYYY_MM_DD));
		calBackDate.set(Calendar.HOUR_OF_DAY, 23);
		calBackDate.set(Calendar.MINUTE, 59);
		calBackDate.set(Calendar.SECOND, 59);
		tBidInvite.setBackDate(calBackDate.getTime());
		Calendar calBeginDate = Calendar.getInstance();
		calBeginDate.setTime(common.formatDate(strBeginDateTime, UtilConstants.DateStyle.YYYY_MM_DD));
		calBeginDate.set(Calendar.HOUR_OF_DAY, 0);
		calBeginDate.set(Calendar.MINUTE, 0);
		calBeginDate.set(Calendar.SECOND, 0);
		calBeginDate.set(Calendar.MILLISECOND, 1);
		tBidInvite.setBeginDate(calBeginDate.getTime());
		Calendar calEndDate = Calendar.getInstance();
		calEndDate.setTime(common.formatDate(strEndDateTime, UtilConstants.DateStyle.YYYY_MM_DD));
		calEndDate.set(Calendar.HOUR_OF_DAY, 23);
		calEndDate.set(Calendar.MINUTE, 59);
		calEndDate.set(Calendar.SECOND, 59);
		tBidInvite.setEndDate(calEndDate.getTime());

		tBidInvite.setState((byte) 0);
		tBidInvite.setAmount(BigDecimal.valueOf(0));

		// 创建所属公司ID 实体类为String类型 需要转化一下 hanxl 2020.11.19
		tBidInvite.setSpare1(String.valueOf(sessionSysUser.getOrgID()));
		tBidInvite.setCreateDate(new Date());
		tBidInvite.setCreator(sessionSysUser.getUserName());
		tBidInviteRepository.save(tBidInvite.getInviteID());
		tBidInviteRepository.save(tBidInvite);
	}

	/**
	 * 函数功能说明：后台修改招标信息
	 *
	 * @param 参数说明 tBidInvite
	 * @return 返回值说明 jsp页面
	 * @author 创建人 hanxl
	 * @date 创建日期 2020.11.19
	 */
	public void updateInvite(TBidInvite tBidInvite, String strOutDateTime, String strBackDateTime,
			String strBeginDateTime, String strEndDateTime, TSysUser sessionSysUser) {
		int iInviteID = tBidInvite.getInviteID();
		// 定义一个新的实体类对象
		TBidInvite dbBidInvite = tBidInviteRepository.findByInviteID(iInviteID);
		dbBidInvite.setInviteName(tBidInvite.getInviteName());
		dbBidInvite.setType(tBidInvite.getType());

		dbBidInvite.setZoneID(tBidInvite.getZoneID());
		dbBidInvite.setSynopsis(tBidInvite.getSynopsis());
		dbBidInvite.setContent(tBidInvite.getContent());
		Calendar calOutDate = Calendar.getInstance();
		calOutDate.setTime(common.formatDate(strOutDateTime, UtilConstants.DateStyle.YYYY_MM_DD));
		calOutDate.set(Calendar.HOUR_OF_DAY, 0);
		calOutDate.set(Calendar.MINUTE, 0);
		calOutDate.set(Calendar.SECOND, 0);
		calOutDate.set(Calendar.MILLISECOND, 1);
		tBidInvite.setOutDate(calOutDate.getTime());
		Calendar calBackDate = Calendar.getInstance();
		calBackDate.setTime(common.formatDate(strBackDateTime, UtilConstants.DateStyle.YYYY_MM_DD));
		calBackDate.set(Calendar.HOUR_OF_DAY, 23);
		calBackDate.set(Calendar.MINUTE, 59);
		calBackDate.set(Calendar.SECOND, 59);
		tBidInvite.setBackDate(calBackDate.getTime());
		dbBidInvite.setMeal(tBidInvite.getMeal());
		dbBidInvite.setStay(tBidInvite.getStay());
		dbBidInvite.setCar(tBidInvite.getCar());
		dbBidInvite.setTrip(tBidInvite.getTrip());
		dbBidInvite.setShop(tBidInvite.getShop());
		dbBidInvite.setRecreation(tBidInvite.getRecreation());
		dbBidInvite.setBudget(tBidInvite.getBudget());

		Calendar calBeginDate = Calendar.getInstance();
		calBeginDate.setTime(common.formatDate(strBeginDateTime, UtilConstants.DateStyle.YYYY_MM_DD));
		calBeginDate.set(Calendar.HOUR_OF_DAY, 0);
		calBeginDate.set(Calendar.MINUTE, 0);
		calBeginDate.set(Calendar.SECOND, 0);
		calBeginDate.set(Calendar.MILLISECOND, 1);
		tBidInvite.setBeginDate(calBeginDate.getTime());
		Calendar calEndDate = Calendar.getInstance();
		calEndDate.setTime(common.formatDate(strEndDateTime, UtilConstants.DateStyle.YYYY_MM_DD));
		calEndDate.set(Calendar.HOUR_OF_DAY, 23);
		calEndDate.set(Calendar.MINUTE, 59);
		calEndDate.set(Calendar.SECOND, 59);
		tBidInvite.setEndDate(calEndDate.getTime());
		dbBidInvite.setState((byte) 0);
		dbBidInvite.setName(tBidInvite.getName());
		dbBidInvite.setTel(tBidInvite.getTel());
		dbBidInvite.setMemo(tBidInvite.getMemo());
		dbBidInvite.setModifyDate(new Date());
		dbBidInvite.setReviser(sessionSysUser.getUserName());
		tBidInviteRepository.save(dbBidInvite);
	}

	/**
	 * 函数功能说明： 前台招投标模块登陆人只能查看所属公司区域市相同的招标
	 *
	 * @param 参数说明 tBidInvite
	 * @return 返回值说明 jsp页面
	 * @author 创建人 hanxl
	 * @date 创建日期 2020.11.19
	 */
	public List<VBidInvite> findByZoneID(String pageNumber, String pageSize, String strInviteName, String strType,
			String strBudget, TSysUser sessionSysUser) {
		int iPageSize = 5;
		int iTempPageNo = 0;
		if (strInviteName == null) {
			strInviteName = "";
		}
		if (strType == null) {
			strType = "";
		}
		if (strBudget == null) {
			strBudget = "";
		}
		if (pageNumber == null) {
			pageNumber = "1";
		}
		iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		/* 通过登录人获取所属公司信息 */
		TSysOrg dbSysOrg = tSysOrgRepository.findByOrgID(sessionSysUser.getOrgID());
		/* 获取公司区域ID */
		int iZoneID = dbSysOrg.getZoneID();
		/* 通过区域ID获取市 */
		TConstZone dbConstZone = tConstZoneRepository.findCity(iZoneID);
		List<VBidInvite> lstBidInvite = vBidInviteRepository.findByCityID(strInviteName, strType, strBudget,
				iTempPageNo, iPageSize, dbConstZone.getZoneID());
		return lstBidInvite;
	}

	/**
	 * 函数功能说明： 前台招投标模块登陆人只能查看所属公司区域市相同的招标 获取分页
	 *
	 * @param 参数说明 tBidInvite
	 * @return 返回值说明 jsp页面
	 * @author 创建人 hanxl
	 * @date 创建日期 2020.11.19
	 */
	public HashMap<String, Integer> mapFrontBidInvite(String pageNumber, String pageSize, String strInviteName,
			String strType, String strBudget, TSysUser sessionSysUser) {
		if (strInviteName == null) {
			strInviteName = "";
		}
		if (strType == null) {
			strType = "";
		}
		if (strBudget == null) {
			strBudget = "";
		}
		/* 通过登录人获取所属公司信息 */
		TSysOrg dbSysOrg = tSysOrgRepository.findByOrgID(sessionSysUser.getOrgID());
		/* 获取公司区域ID */
		int iZoneID = dbSysOrg.getZoneID();
		/* 通过区域ID获取市 */
		TConstZone dbConstZone = tConstZoneRepository.findCity(iZoneID);
		pageSize = "5";
		HashMap<String, Integer> mapPage = new HashMap<String, Integer>();
		mapPage = common.getPage(pageNumber, pageSize,
				tBidInviteRepository.countByCityID(strInviteName, strType, strBudget, dbConstZone.getZoneID()));
		return mapPage;
	}

	/**
	 * 函数功能说明：后台发布招标信息
	 *
	 * @param 参数说明 tBidInvite
	 * @return 返回值说明 jsp页面
	 * @author 创建人 hanxl
	 * @date 创建日期 2020.11.19
	 */
	public byte updateState(String strInviteID, TSysUser sessionSysUser) {
		int iInviteID = Integer.parseInt(strInviteID);
		// 定义一个新的实体类对象
		TBidInvite dbBidInvite = tBidInviteRepository.findByInviteID(iInviteID);
		if (dbBidInvite.getState() == 0) {
			if (dbBidInvite.getBudget().doubleValue() < (double) 2000) {

				dbBidInvite.setState((byte) 1);
			} else {
				dbBidInvite.setState((byte) 2);
			}
			dbBidInvite.setModifyDate(new Date());
			dbBidInvite.setReviser(sessionSysUser.getUserName());
			tBidInviteRepository.save(dbBidInvite);
		}
		return dbBidInvite.getState();
	}

	/**
	 * 后台招标管理中显示要审核的招标信息
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.11.19 修改时间2021.03.17
	 */
	public List<VBidInvite> findByState() {

		List<VBidInvite> lstBidInvite = vBidInviteRepository.findByState();
		return lstBidInvite;
	}

	/**
	 * 函数功能说明：后台审核招标信息 通过审核发布
	 *
	 * @param 参数说明 tBidInvite
	 * @return 返回值说明 jsp页面
	 * @author 创建人 hanxl 整理
	 * @param string
	 * @date 创建日期 2020.11.19
	 */
	public void updatePassState(String strAmount, String strAccountState, String strInviteID, TSysUser sessionSysUser) {
		int iAccountState = Integer.parseInt(strAccountState);
		TBidInvite dbBidInvite = tBidInviteRepository.findByInviteID(Integer.parseInt(strInviteID));
		if (iAccountState == 3) {
			BigDecimal fAmount = new BigDecimal(strAmount);
			dbBidInvite.setAmount(fAmount);
			dbBidInvite.setState((byte) 3);
		} else {
			dbBidInvite.setState((byte) 4);
		}
		dbBidInvite.setModifyDate(new Date());
		dbBidInvite.setReviser(sessionSysUser.getUserName());
		tBidInviteRepository.save(dbBidInvite);

	}

	/**
	 * 函数功能说明：后台投标中标以后 招标状态改为已结束
	 *
	 * @param 参数说明 tBidInvite
	 * @return 返回值说明 jsp页面
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.11.19
	 */
	public void updateInviteState(String strTenderID, TSysUser sessionSysUser) {
		// 通过投标ID获得招标信息
		int iTenderID = Integer.parseInt(strTenderID);
		// 定义一个新的实体类对象
		TBidTender dbBidTender = tBidTenderRepository.findByTenderID(iTenderID);
		TBidInvite dbBidInvite = tBidInviteRepository.findByInviteID(dbBidTender.getInviteID());
		dbBidInvite.setState((byte) 6);
		dbBidInvite.setModifyDate(new Date());
		dbBidInvite.setReviser(sessionSysUser.getUserName());
		tBidInviteRepository.save(dbBidInvite);
	}

	/**
	 * 函数功能说明：前台首页招标模块显示公务类型的已发布的招标信息
	 *
	 * @param 参数说明 tBidInvite
	 * @return 返回值说明 jsp页面
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.11.19
	 */
	public List<VBidInvite> findByType0(TSysUser sessionSysUser) {
		/* 通过登录人获取所属公司信息 */
		TSysOrg dbSysOrg = tSysOrgRepository.findByOrgID(sessionSysUser.getOrgID());
		/* 获取公司区域ID */
		int iZoneID = dbSysOrg.getZoneID();
		/* 通过区域ID获取市 */
		TConstZone dbConstZone = tConstZoneRepository.findCity(iZoneID);
		List<VBidInvite> lstBidInvite = vBidInviteRepository.findByType0(dbConstZone.getZoneID());
		return lstBidInvite;
	}

	/**
	 * 函数功能说明：前台首页招标模块显示团建类型的已发布的招标信息
	 *
	 * @param 参数说明 tBidInvite
	 * @return 返回值说明 jsp页面
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.11.19
	 */
	public List<VBidInvite> findByType1(TSysUser sessionSysUser) {
		/* 通过登录人获取所属公司信息 */
		TSysOrg dbSysOrg = tSysOrgRepository.findByOrgID(sessionSysUser.getOrgID());
		/* 获取公司区域ID */
		int iZoneID = dbSysOrg.getZoneID();
		/* 通过区域ID获取市 */
		TConstZone dbConstZone = tConstZoneRepository.findCity(iZoneID);
		List<VBidInvite> lstBidInvite = vBidInviteRepository.findByType1(dbConstZone.getZoneID());
		return lstBidInvite;
	}

	/**
	 * 函数功能说明：前台首页招标模块显示业内类型的已发布的招标信息
	 *
	 * @param 参数说明 tBidInvite
	 * @return 返回值说明 jsp页面
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.11.19
	 */
	public List<VBidInvite> findByType2(TSysUser sessionSysUser) {
		/* 通过登录人获取所属公司信息 */
		TSysOrg dbSysOrg = tSysOrgRepository.findByOrgID(sessionSysUser.getOrgID());
		/* 获取公司区域ID */
		int iZoneID = dbSysOrg.getZoneID();
		/* 通过区域ID获取市 */
		TConstZone dbConstZone = tConstZoneRepository.findCity(iZoneID);
		List<VBidInvite> lstBidInvite = vBidInviteRepository.findByType2(dbConstZone.getZoneID());
		return lstBidInvite;
	}

	/**
	 * 函数功能说明：前台首页招标模块显示业内类型的已发布的招标信息
	 *
	 * @param 参数说明 tBidInvite
	 * @return 返回值说明 jsp页面
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.11.19
	 */
	public List<VBidInvite> findByType3(TSysUser sessionSysUser) {
		/* 通过登录人获取所属公司信息 */
		TSysOrg dbSysOrg = tSysOrgRepository.findByOrgID(sessionSysUser.getOrgID());
		/* 获取公司区域ID */
		int iZoneID = dbSysOrg.getZoneID();
		/* 通过区域ID获取市 */
		TConstZone dbConstZone = tConstZoneRepository.findCity(iZoneID);
		List<VBidInvite> lstBidInvite = vBidInviteRepository.findByType3(dbConstZone.getZoneID());
		return lstBidInvite;
	}

	/**
	 * 后台招标管理中显示未审核的 异步加载表格
	 *
	 * @author 创建人 hanxl 整理 修改人hanxl
	 * @date 创建日期 2020.11.19 修改时间2021.02.22
	 */
	public List<VBidInvite> findReviewByState(int startIndex, int count) {

		List<VBidInvite> lstBidInvite = vBidInviteRepository.findSearchReview(startIndex, count);

		return lstBidInvite;
	}

	/**
	 * 后台招标管理中显示未审核的招标信息 分页
	 *
	 * @author 创建人 hanxl 整理 修改人hanxl
	 * @date 创建日期 2020.11.19 修改时间2021.02.22
	 */

	public int queryBaseReviewCount() {
		int count = 0;
		count = tBidInviteRepository.countReview();
		return count;
	}

}
